package com.chf.items;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.sounds.SoundSource;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.AxeItem;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Tiers;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SaplingBlock;
import org.jetbrains.annotations.NotNull;

/**
 * 下界合金斧
 *
 * @author niooooo
 */
public class ObsidianAxe extends AxeItem {

    /**
     * 创建一个斧头
     *
     * @param attackDamage 武器伤害 --> 最终伤害 = 基础伤害 + 物品材质伤害 + 武器伤害。基础伤害为1.0
     * @param attackSpeed  攻击速度 --> 最终攻速 = 基础攻速 + 武器攻速。基础攻速为4.0
     * @param properties   属性 --> 物品的最大堆叠栈(数量),物品的最大耐久值,物品的所在创造物品栏位置等等
     */
    public ObsidianAxe(int attackDamage, float attackSpeed, Properties properties) {
        super(Tiers.NETHERITE, attackDamage, attackSpeed, properties);
    }

    /**
     * 右键点击方块时触发（自动获取背包中的树苗进行放置）
     *
     * @param useOnContext {@link UseOnContext} 上下文
     * @return {@link InteractionResult}
     */
    @Override
    public @NotNull InteractionResult useOn(@NotNull UseOnContext useOnContext) {
        // 获取世界、玩家、被右键的方块所在时间、位置、方向
        Level level = useOnContext.getLevel();
        Player player = useOnContext.getPlayer();
        BlockPos blockPos = useOnContext.getClickedPos();
        Direction direction = useOnContext.getClickedFace();

        // 只在服务器端执行
        //if (!level.isClientSide() && player != null) {
        // TODO 测试
        if (true) {
            // 遍历玩家的背包列表
            for (int i = 0; i < player.getInventory().getContainerSize(); i++) {
                // 1、获取背包中的物品
                ItemStack stack = player.getInventory().getItem(i);
                // 2、获取物品对应的方块
                if (stack.getItem() instanceof BlockItem blockItem) {
                    Block block = blockItem.getBlock();
                    // 3、获取方块对应的树
                    if (block instanceof SaplingBlock saplingBlock) {
                        // 4、计算放置位置（在点击的方块旁边）
                        BlockPos placePos = blockPos.relative(direction);

                        // 5、检查位置是否有效
                        if (saplingBlock.canSurvive(saplingBlock.defaultBlockState(), level, placePos)) {
                            // 6、1.20.1 放置方块的方式
                            level.setBlock(placePos, saplingBlock.defaultBlockState(), 3);

                            // 7、消耗物品
                            stack.shrink(1);

                            // 8、播放放置音效
                            level.playSound(null, placePos,
                                    block.getSoundType(block.defaultBlockState()).getPlaceSound(),
                                    SoundSource.BLOCKS, 1.0F, 1.0F);

                            return InteractionResult.CONSUME;
                        }
                    }
                }
            }
        }
        // 客户端返回成功以播放动画
        return InteractionResult.sidedSuccess(level.isClientSide());
    }
}
